Docker로 실행 중인 Redis 컨테이너에 외부 서버에서 접근이 불가능한 문제

Redis 네트워크 연결 문제 해결

문제 상황

원인

해결 과정

  1. 현재 네트워크 상태 확인
sudo iptables -L -n
sudo iptables -L -n -t nat
ip addr show docker0
bridge link show
  1. Docker 컨테이너 상태 확인
docker ps
netstat -tulnp | grep 6379
  1. Redis 컨테이너 설정 확인
docker logs redis
docker inspect redis
  1. Docker host 네트워크 모드로 재설정
# 기존 컨테이너 제거
docker stop redis
docker rm redis

# host 네트워크 모드로 재실행
docker run --network host --name redis -d redis:latest --requirepass "password" --bind 0.0.0.0
2026-10 보완

당시에는 host 네트워크로 바꿔 해결했지만, bridge 모드 + 포트 매핑으로도 외부 접근은 정상적으로 가능해야 합니다. host 모드로 바꾸기 전에 아래 순서로 원인을 먼저 확인하는 것이 좋습니다.

  1. 포트 매핑 여부: 컨테이너를 -p 6379:6379로 실행했는지 docker port redis로 확인합니다. 출력이 없으면 포트가 호스트에 게시되지 않은 것입니다. -p 127.0.0.1:6379:6379처럼 루프백에만 묶여 있지 않은지도 확인합니다.
  2. Redis bind / protected-mode: Redis 공식 Docker 이미지는 다른 컨테이너에서 접속하기 쉽도록 protected-mode가 기본으로 꺼져 있습니다(Docker Hub 공식 설명). 그래서 공식 이미지를 그대로 쓰면 이 항목이 원인일 가능성은 낮습니다. 반대로 -p로 공개하면 비밀번호 없이 누구나 접속할 수 있으니 반드시 비밀번호를 설정합니다. 직접 만든 redis.conf를 마운트했다면 그 파일의 bind, protected-mode, requirepass를 따르므로 이때는 꼭 확인합니다(Redis 자체 기본값은 protected-mode 켜짐).
  3. 호스트 방화벽: sudo ufw status, sudo iptables -L -n(DOCKER / DOCKER-USER 체인 포함)에서 6379가 막혀 있지 않은지 확인합니다.
  4. 클라우드 보안그룹(SG)/NACL: user 서버 → static 서버 6379/TCP 인바운드가 허용되어 있는지 확인합니다.

--network host는 컨테이너의 네트워크 격리를 없애므로(호스트의 모든 포트·인터페이스 공유) 꼭 필요한 경우에만 사용합니다. 또한 redis:latest 대신 버전을 고정(예: redis:8.10)하고, "password" 같은 값이 아닌 강력한 비밀번호를 사용하며, 6379 포트는 필요한 서버 IP/SG에서만 접근 가능하도록 제한합니다.

# bridge + 포트 매핑 예시
docker run -d --name redis -p 6379:6379 redis:8.10 --requirepass "<강력한-비밀번호>"
  1. 연결 테스트
# Redis CLI 로컬 연결 테스트
redis-cli -h localhost -a password ping

# 포트 응답 확인
curl localhost:6379

# 원격 서버 연결 테스트
telnet static_server_ip 6379

추가 설정

# Docker 컨테이너 자동 실행 설정
docker update --restart=always redis

# Docker 로그 확인
docker logs -f redis

# Redis 컨테이너 상태 모니터링
docker stats redis

네트워크 구성 변경 사항

변경 전

변경 후